home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJTST200.ZIP / tests / libc / fsext / pipe.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-25  |  2.5 KB  |  136 lines

  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <sys/fsext.h>
  4.  
  5. #ifndef PIPE_MAX
  6. #define PIPE_MAX 16384
  7. #endif
  8.  
  9. static char pbuf[PIPE_MAX];
  10. static int putp, getp, count;
  11.  
  12. static int
  13. pipe_handler(__FSEXT_Fnumber func_number, int *rv, va_list args);
  14.  
  15. static int
  16. pipe_open(int *rv, va_list args)
  17. {
  18.   char *fn = va_arg(args, char *);
  19.   printf("pipe_open: checking `%s'\n", fn);
  20.   if (strcmp(fn, "/dev/pipe"))
  21.     return 0;
  22.   *rv = __FSEXT_alloc_fd(pipe_handler);
  23.   printf("pipe_open: it's me, at fd %d\n", *rv);
  24.   putp = getp = count = 0;
  25.   return 1;
  26. }
  27.  
  28. static int
  29. pipe_read(int *rv, va_list args)
  30. {
  31.   int fd = va_arg(args, int);
  32.   char *buf = va_arg(args, char *);
  33.   int len = va_arg(args, int);
  34.   int r = 0;
  35.  
  36.   printf("pipe_read: reading %d bytes from %d: ", len, fd);
  37.   while (count && len)
  38.   {
  39.     *buf++ = pbuf[getp++];
  40.     printf(" %02x", buf[-1] & 0xff);
  41.     if (getp > PIPE_MAX)
  42.       getp = 0;
  43.     count--;
  44.     len--;
  45.     r++;
  46.   }
  47.   printf(" returning %d\n", r);
  48.   *rv = r;
  49.   return 1;
  50. }
  51.  
  52. static int
  53. pipe_write(int *rv, va_list args)
  54. {
  55.   int fd = va_arg(args, int);
  56.   char *buf = va_arg(args, char *);
  57.   int len = va_arg(args, int);
  58.   int r = 0;
  59.  
  60.   printf("pipe_write: writing %d bytes from %d: ", len,  fd);
  61.   while (PIPE_MAX-count && len)
  62.   {
  63.     pbuf[putp++] = *buf++;
  64.     printf(" %02x", buf[-1] & 0xff);
  65.     if (putp > PIPE_MAX)
  66.       putp = 0;
  67.     count++;
  68.     len--;
  69.     r++;
  70.   }
  71.   printf(" returning %d\n", r);
  72.   *rv = r;
  73.   return 1;
  74. }
  75.  
  76. /* ARGSUSED */
  77. static int
  78. pipe_close(int *rv, va_list args)
  79. {
  80.   *rv = 0;
  81.   printf("pipe_close\n");
  82.   return 1;
  83. }
  84.  
  85. static int
  86. pipe_handler(__FSEXT_Fnumber func_number, int *rv, va_list args)
  87. {
  88.   switch (func_number)
  89.   {
  90.   case __FSEXT_open:
  91.   case __FSEXT_creat:
  92.     return pipe_open(rv, args);
  93.   case __FSEXT_read:
  94.     return pipe_read(rv, args);
  95.   case __FSEXT_write:
  96.     return pipe_write(rv, args);
  97.   case __FSEXT_close:
  98.     return pipe_close(rv, args);
  99.   default:
  100.     return 0;
  101.   }
  102. }
  103.  
  104. int
  105. main(void)
  106. {
  107.   FILE *fd;
  108.   int c;
  109.  
  110.   __FSEXT_add_open_handler(pipe_handler);
  111.  
  112.   fd = fopen("/dev/pipe", "r+");
  113.   if (fd == 0)
  114.   {
  115.     perror("/dev/pipe");
  116.     return 0;
  117.   }
  118.   printf("fopen: fd=%d\n", fileno(fd));
  119.  
  120.   printf("begin write test\n");
  121.   fprintf(fd, "hello ");
  122.   fprintf(fd, "there\n");
  123.  
  124.   printf("begin read test\n");
  125.   fflush(fd);
  126.  
  127.   while ((c = fgetc(fd)) != EOF)
  128.   {
  129.     putchar(c);
  130.   }
  131.  
  132.   printf("begin close\n");
  133.   fclose(fd);
  134.   return 0;
  135. }
  136.